////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxoverridesettingsstore.h
/// @brief Declarations for the IOverrideSettingsStore interface.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXOVERRIDESETTINGSSTORE_H
#define CAMXOVERRIDESETTINGSSTORE_H

// Common CamX Include
#include "camxincs.h"

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Forward Declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct EnumeratorToHashMap;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief IOverrideSettingsStore is a pure abstract interface implemented by specific override settings store classes.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// NOWHINE CP017,CP018,CP044: Interface does not need copy/assignment/default overrides
class IOverrideSettingsStore
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Public Methods
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destroy
    ///
    /// @brief  This function destroys the instance of the override settings store class that implements this interface.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID Destroy() = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ReadSettingINT
    ///
    /// @brief  This function reads a signed integer value from the settings store.
    ///
    /// @param  settingsStringHash  The 32-bit hash of the setting to retrieve
    /// @param  pVal                A pointer to the storage for the signed integer setting's value
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID ReadSettingINT(
        UINT32  settingsStringHash,
        INT*    pVal
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ReadSettingUINT
    ///
    /// @brief  This function reads an unsigned integer value from the settings store.
    ///
    /// @param  settingsStringHash  The 32-bit hash of the setting to retrieve
    /// @param  pVal                A pointer to the storage for the unsigned integer setting's value
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID ReadSettingUINT(
        UINT32  settingsStringHash,
        UINT*   pVal
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ReadSettingBOOL
    ///
    /// @brief  This function reads a Boolean value from the settings store.
    ///
    /// @param  settingsStringHash  The 32-bit hash of the setting to retrieve
    /// @param  pVal                A pointer to the storage for the Boolean setting's value
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID ReadSettingBOOL(
        UINT32  settingsStringHash,
        BOOL*   pVal
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ReadSettingFLOAT
    ///
    /// @brief  This function reads a floating point value from the settings store.
    ///
    /// @param  settingsStringHash  The 32-bit hash of the setting to retrieve
    /// @param  pVal                A pointer to the storage for the floating point setting's value
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID ReadSettingFLOAT(
        UINT32  settingsStringHash,
        FLOAT*  pVal
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ReadSettingEnum
    ///
    /// @brief  This function reads an enumerated type value from the settings store.
    ///
    /// @param  settingsStringHash      The 32-bit hash of the setting to retrieve
    /// @param  pVal                    A pointer to the storage for the enumerated type setting's value
    /// @param  pEnumeratorToHashMap    The array of enumerator-to-hash mappings
    /// @param  enumeratorToHashMapSize The number of elements in the enumerator-to-hash mapping array
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID ReadSettingEnum(
        UINT32                  settingsStringHash,
        INT*                    pVal,
        EnumeratorToHashMap*    pEnumeratorToHashMap,
        UINT                    enumeratorToHashMapSize
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ReadSettingString
    ///
    /// @brief  This function reads a string value from the settings store.
    ///
    /// @param  settingsStringHash  The 32-bit hash of the setting to retrieve
    /// @param  pVal                A pointer to the storage for the floating point setting's value
    /// @param  stringLength        Then length of the string in bytes
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID ReadSettingString(
        UINT32  settingsStringHash,
        CHAR*   pVal,
        SIZE_T  stringLength
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IsSettingOverridden
    ///
    /// @brief  Indicates whether a setting has been added to the cache, meaning that some value was explicitly set in the
    ///         override settings text file.
    ///
    /// @param  stringSettingHash The 32-bit hash of the setting to retrieve
    ///
    /// @return TRUE if setting is overridden, FALSE otherwise (indicating default value is used)
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual BOOL IsSettingOverridden(
        UINT32 stringSettingHash
        ) const = 0;

#if SETTINGS_DUMP_ENABLE
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpOverriddenSettings
    ///
    /// @brief  This function prints all overridden settings names and values in the settings store.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID DumpOverriddenSettings() const = 0;
#endif // SETTINGS_DUMP_ENABLE

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IOverrideSettingsStore
    ///
    /// @brief  This is the protected virtual destructor for the class.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IOverrideSettingsStore() = default;
};

CAMX_NAMESPACE_END

#endif // CAMXOVERRIDESETTINGSSTORE_H
